package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

// 全局变量：表示票
var ticket1 = 10 //100张票

var mutex sync.Mutex //创建锁头

var wg1 sync.WaitGroup //同步等待组对象

func main() {
	/*
		4 个goroutine，模拟 4 个售票口

		互斥锁：当一个goroutine访问临界资源时，其他的goroutine不能来访问临界资源

		在使用互斥锁的时候，对资源操作完，一定要解锁，否则会出现程序异常，死锁等问题
			建议使用 defer 解锁
	*/
	wg1.Add(4)
	go saleTicket1("售票口1")
	go saleTicket1("售票口2")
	go saleTicket1("售票口3")
	go saleTicket1("售票口4")

	wg1.Wait() //main要等待
	fmt.Println("程序结束了。。。")

	//time.Sleep(5 * time.Second)
}

func saleTicket1(name string) {
	rand.Seed(time.Now().UnixNano())
	defer wg1.Done()
	for {
		//上锁
		mutex.Lock()
		if ticket1 > 0 {
			time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)
			fmt.Println(name, "售出：", ticket1)
			ticket1--
		} else {
			mutex.Unlock() //条件不满足，也要解锁
			fmt.Println(name, "没票啦。。。")
			break
		}
		mutex.Unlock() //解锁
	}
}
